package com.sxt.resttemplate.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import lombok.extern.slf4j.Slf4j;

/**
 * 
 * @author 罗林
 * 
 *         SimpleClientHttpRequestFactory（封装URLConnection）
 *         HttpComponentsClientHttpRequestFactory（封装HttpClient）
 *         OkHttp3ClientHttpRequestFactory(封装OKHttp)
 *         使用的时候一般都会只选择其中的一种，所以上面的几种配置任选其一
 */
@Slf4j
@Configuration
public class RestTemplateConfig {
	/** 建立连接的超时时间 */
	private static int connectTimeout = 20000;
	/** 连接不够用的等待时间 */
	private static int requestTimeout = 20000;
	/** 每次请求等待返回的超时时间 */
	private static int socketTimeout = 30000;
	/** 每个主机最大连接数 */
	private static int defaultMaxPerRoute = 100;
	/** 最大连接数 */
	private static int maxTotalConnections = 300;


	@Bean("urlConnection")
	public RestTemplate urlConnectionRestTemplate(ClientHttpRequestFactory factory) {
		RestTemplate restTemplate = new RestTemplate(factory);
		return restTemplate;
	}

//	@Bean("httpClient")// @bean(name=“xxxx”) xxx是自定义名字,不定义名字 默认就是方法名, 启动类调用这个名字就行
//	public RestTemplate httpClientRestTemplate() {
//		RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
//		return restTemplate;
//	}
//
//	@Bean("OKHttp3")
//	public RestTemplate OKHttp3RestTemplate() {
//		RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory());
//		return restTemplate;
//	}

	@Bean
	public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
		SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
		factory.setConnectTimeout(connectTimeout); // 连接超时
		factory.setReadTimeout(requestTimeout); // 数据读取超时时间
		return factory;
	}
}
